home *** CD-ROM | disk | FTP | other *** search
- File: LUDEF5.DOC Date: 84-08-19
- Replaces: LUDEF4.DOC Dated: 84-08-04
-
- From: Gary P. Novosielski
- To: All LU users
-
- Subj: .LBR format definition
-
- This file is a revision of and obsoletes the previous
- version. Revised material is indicated by a vertical
- bar (|) to the left of the text.
-
- 0. Introduction
- | This is the fifth revision of the formal definition of
- the format of library (.LBR) files as used by the LU Library
- Utility program and the LRUN command-file load-and-go utility.
- | Many thanks to all of those who have taken the time to
- |make suggestions for improvements to this definition. Purely
- |voluntary compliance with this standard by scores of program-
- |mers on many differing operating systems has allowed the .LBR
- |format to evolve into a successful exchange tool in many
- |segments of the computing community. Additional suggestions
- |are encouraged.
- | Please note that the current version of LU does not support
- |the full directory format as defined here. This revision has
- |been distributed as an aid to programmers working on various
- |other programs on non-CP/M operating systems, to allow support
- |for new features in a standardized manner.
-
- 1. Library Overview
- | A library is a data file which is assumed to be logically
- divided into one or more subparts called members. The library
- may have any filename and filetype, except that ".LBR" is
- considered to be the default filetype. Programs must assume
- and may optionally require the .LBR extension on any file
- which is to be treated as a library.
-
- 2. Disk Access Method
- Libraries are usually treated as Random Record files by
- programs, but must never contain unallocated "holes" which
- are normally allowed in Random Record files. A library can
- therefore be safely treated as a sequential file if desired.
- This allows copy programs, compacting programs, and remote
- transfer programs to process the library sequentially, and to
- safely make the assumption that the first occurrence of a
- no-record-found condition truly indicates the physical end of
- the library.
-
- 3. Internal Organization
- A library must contain at least one member, the directory,
- and may contain an arbitrary number of other members, up to
- the limits of file size imposed by the operating system. The
- library may also contain unused sectors which are not assigned
- to any member. These sectors may occur as a result of the
- deletion of members, or of an unsuccessful add operation.
- There are no constraints on the contents of members, except
- for the directory, which is always the first member in the
- |library, and has a specific format defined later. The entire
- |library file and each of its members are conceptually
- |organized into "sectors", each sector being 128 bytes long.
- Each sector of the file belongs to at most one library member.
- |Each member comprises a whole number of sectors. The last
- |sector of a member may, however, be logically declared as a
- |"Short Sector". Although it physically contains 128 bytes,
- |a Short Sector contains one or more "pad" bytes at the end
- |for the purpose of maintaining the structure of the library
- file as a whole. A member may have as few as 0 sectors.
-
- Members may be referred to by a name of up to 8 characters,
- and an extension of up to 3 characters. The naming rules
- are identical to those for the naming of CP/M-80 disk files.
- |Members must be uniquely named; any given combination of name
- |and extension may identify at most one member.
-
- The start and end points of each member are defined by the
- pointers in a "directory entry" for the member. There are no
- embedded start or end marks separating the members. All
- sectors between the start and end sectors of a member belong
- |to that member. The members need not appear in the library
- |in the same order that their directory entries appear in the
- |directory. Thus the directory may be sorted, within certain
- |ordering constraints defined below, without physically moving
- |the members themselves.
-
- 4. Directory Format
- The directory is the first member of a library, and must
- begin in sector 0 of the file. It must contain at least one
- sector, and may contain an arbitrary number of sectors. The
- |directory may not contain a Short Sector.
- The directory is composed of entries. Each entry is 32
- bytes in length, so that the number of entries is equal to
- four times the number of sectors in the directory. The
- |number of entries present determines the maximum number of
- |members in the library. Each directory entry contains the
- |name, starting point, size, and other information for one
- |of the members in the library.
- Each entry is initialized to one of three possible states:
- Active, Deleted, or Unused. The first entry is always active,
- and is the entry corresponding to the directory itself.
- Unused entries always occur after all active and deleted
- entries. If the directory is scanned beginning with the
- first entry, and an unused entry is found, then all remaining
- entries from there through the end of the directory must also
- be tagged as unused.
- However, active and deleted entries may be mixed in any
- order. Finding a deleted entry does not guarantee that all
- active entries have been scanned.
-
- 5. Directory Entry Format
-
- The 32 bytes of each entry have the following significance:
-
- Byte Meaning
- ---- ------------------------------------------
- 0 STATUS Possible values (in hexadecimal) are:
- 00 Active Entry
- FE Deleted Entry
- FF Unused Entry
- Any other value should be treated as
- a deleted entry.
-
- 1-8 NAME Rules are identical with those which
- govern the naming of disk files. Names
- shorter than the maximum are padded with
- spaces.
-
- 9-11 EXTENSION Rules are the same as for NAME.
-
- 12-13 INDEX Pointer to the first sector of the
- member within the library. Stored as
- a two-byte binary value, least significant byte
- | first. For example, an index of value of 9
- | indicates that the first sector of the member
- | occurs 9 sectors, or 9 * 128 = 1152 bytes from
- | the beginning of the library.
-
- 14-15 LENGTH The length of the member in sectors.
- Stored as a two-byte binary value,
- least significant byte first. If this value is
- zero, then the member is empty, and the Index
- field (above) is meaningless.
-
- 16-17 CRC The Cyclic Redundancy Check value for
- the member. Stored as a two-byte
- binary value, least significant byte first.
- This value is calculated using the CCITT
- algorithm as used in the widely supported
- XMODEM protocol. If each of the bytes in the
- | member (including any pad bytes inserted in the
- | possibly "short" last sector) are processed by
- | this algorithm, followed by the two bytes of
- the CRC itself (high order first) the resulting
- value will be zero.
- | Special-case processing is required for the
- | CRC value of the directory member. See below.
- |
- | The next four 16-bit words are reserved for library
- | member time and date stamping. They are all stored
- | as two-byte binary values, least significant byte
- | first. Programs not implementing time and date
- | stamping shall explicitly set any unused values to
- | zero when creating a new entry. Programs must convert
- | the time and date formats, if any, defined by their own
- | operating system into the given formats to insure
- | transportability of the resulting library file.
-
- | 18-19 CREATION DATE The date of creation of the
- | file. Its value may be prior
- | to the date the file was added as a member of
- | the library, if the operating system can supply
- | the original creation date of the file. On
- | extracting the member from the library, this
- | date may be passed to the operating system for
- | its use in restoring the original creation
- | date. The format for the date conforms to
- | Digital Research MP/M (and CP/M+) julian date
- | format. This is a binary 16-bit integer
- | value representing the number of days since
- | December 31, 1977. For example: Jan 1, 1978
- | is day 1 (0001H), and July 4, 1984 is 2377
- | (0949H). A zero value indicates this date is
- | not available.
-
- | 20-21 LAST CHANGE DATE The date of last change to
- | the member. Assumed to be
- | no earlier than the creation date, and may
- | pre-date the addition of the file as a member.
- | Storage format is identical to creation date.
- | If the operating system supplies only one file
- | date, it should be stored in Creation Date,
- | and Last Change Date left unused (set to zero.)
- | A zero value is assumed to be equal to the
- | creation date. A program which makes any
- | in-place changes to the member while it resides
- | in the library should update the value of this
- | field with the current date if known, or if
- | not known, should overwrite with zeros. For
- | the purpose of this definition, the performing
- | of a strictly reversable process, such as the
- | encryption, compression, or translation of a
- | member does not require a change of date.
-
- | 22-23 CREATION TIME If available, the time-of-day
- | corresponding to the creation
- | date as defined above. The storage format
- | conforms to MS-DOS standards, wherein the 16-
- | bit word comprises three sub-fields as follows:
- |
- | byte: <==23==> <==22==>
- | bit: 76543210 76543210
- | field: hhhhhmmm mmmsssss
- |
- | legend:
- | h = Hours. Treated as a 5-bit binary integer
- | in the range 0..23
- | m = Minutes. Treated as a 6-bit binary integer
- | in the range 0..59
- | s = Seconds/2. Treated as a 5-bit binary
- | integer in the range 0..29, allowing
- | resolution to the nearest 2-second
- | interval. May be zeros in a system
- | supporting only hour/minutes.
- |
- | 24-25 LAST CHANGE TIME If available, the time of
- | day corresponding to the
- | Last Change Date defined above. Format is the
- | same as Creation Time.
-
- | 26 PAD COUNT Valid range: 00H to 7FH. This
- | byte is for use with non-CP/M
- | systems, such as MS-DOS and UNIX, where file
- | lengths are not necessarily a multiple of 128
- | bytes. It allows the exact size of the member
- | to be expressed in the directory entry. The
- | value in PAD COUNT represents the number of pad
- | bytes (from 0 to 127) which were inserted in
- | the final sector of the member to bring its
- | size up to the required 128 bytes. The value
- | of each pad byte inserted should be a hexi-
- | decimal 1A (ASCII SUB character) which is
- | a normal end-of-file mark under CP/M.
- |
- | For example, a Pad Count of 10 hexidecimal (16
- | decimal) implies that the last 16 bytes of the
- | final sector of the member are pad characters,
- | i.e. that only the first 112 bytes (128-16) are
- | actually part of the member file. The pad
- | characters may be ignored when the member is
- | extracted from the library. The resulting file
- | is then the same length as the original.
- | Specifically, it is ((LENTH * 128) - PAD COUNT)
- | bytes long.
- |
- | Note well, however, that the pad characters are
- | in fact physically present in the library file,
- | and are counted as significant characters in
- | the CRC check value calculations discussed
- | above. This is necessary to provide downward
- | compatibility with older libraries, and with
- | programs which do not implement this feature,
- | such as CP/M-only versions of LU. Any program
- | not implementing this feature shall explicitly
- | set this byte to zero when creating a new
- | entry. (Libraries built by any program which
- | properly adhered to prior versions of this
- | standard have therefore been properly created.)
- | In this case, the last sector of the member
- | will be assumed to be a full 128 bytes long,
- | which was always the case in the past.
-
- 27-31 FILLER Reserved for future use. In unused
- and deleted entries, these bytes are
- garbage. In all active entries, they are explicitly
- set to binary zero.
- Any future enhancements to the .LBR format which
- make use of these bytes will recognize this zero
- value as a non-error condition to allow a library
- created with an old version of LU to be processed by
- future versions.
-
- | 6. Directory Control Entry
- | The Directory Control Entry is always the first entry in
- | the directory, and is the entry which corresponds to the
- | directory member itself. This entry is similar in form to
- | any other entry, but is specified more completely here for
- | clarification.
- |
- | STATUS Always 00, Active. The directory must
- | always be an active member.
- |
- | NAME Always 8 blanks. This is the unique
- | name of the directory member.
- |
- | EXTENSION Always 3 blanks.
- |
- | INDEX Always 0000; the directory must be
- | physically located at the beginning of
- | the library file.
- |
- | LENGTH Never 0000. The directory must contain
- | at least one sector. The actual length
- | of the directory is found here.
- |
- | If any program finds, in the first sixteen bytes of a library
- | file, one or more values which conflict with the above
- | specifications, this fact shall be interpreted as a fatal
- | indication that the file is not a valid LBR-format library.
- | Errors in the following bytes are non-fatal:
- |
- | CRC Since the directory contains its own
- | entry, and hence its own CRC value, a
- | logical conflict would arise if the CRC value were
- | calculated in the normal manner. The act of storing
- | the CRC value in the entry would render it invalid.
- | For this reason, the CRC value of the directory member
- | is calculated after explicitly storing a 0000 value
- | in the CRC word of the first entry. The resulting
- | calculated value is then stored in this word before
- | closing the library.
- | When checking the CRC of an existing directory, the
- | old CRC value in the first entry is saved in temporary
- | storage and replaced by 0000 before calculating the
- | new CRC value. The old and new values should then be
- | compared for equality.
-
- CREATION DATE If used, the date of creation of the
- library. Reorganization of the library
- to reclaim space may leave this date unchanged.
-
- LAST CHANGE DATE If used, the date of last change to
- the directory. The directory is
- changed by adding, deleting, or renaming members, and
- by reorganizing the library.
-
- CREATION TIME If used, the time of creation of the
- library.
-
- LAST CHANGE TIME If used, the time of last change to
- the directory.
-
- PAD COUNT Value ignored and assumed 0. Directory
- sectors are always a full 128 bytes.
- Set to 0 when library is created or reorganized.
-
- FILLER Set to 0 as in any other entry.
-
- Notes:
- In unused and deleted entries all bytes except the
- Status byte are undefined.
-
- The contents of any data sectors which are not
- assigned to an active member are not defined.
- They remain allocated to the .LBR file, to provide
- for sequential processing, as noted above, but no
- assumptions should be made as to their contents.
- These sectors are eliminated from the library when
- it is reorganized.
-
- For systems which do not implement the CRC validation
- functions, the CRC value of member entries should
- | be set to 0000. Libraries created by very early
- | versions of LU may have garbage in the last 16 bytes
- | of the first directory entry, but all other entries
- | will conform to this convention. These old library
- | files may generate spurious (but non-fatal) error
- | messages caused by a garbage Directory CRC. Attempts
- | to support the detection of this condition, and the
- | supression of these error messages has become more and
- | more complex to implement, and more difficult to
- | justify. Beginning with this definition, such attempts
- | are forsaken. Users experiencing a problem with this
- | are encouraged to make a minor change to such libraries
- | with a version 3.0 or higher LU. A dummy add/delete or
- | reorganization will suffice. My appologies for any
- | inconvenience this may cause.
-
- 6. Conclusion
- If there are any further questions, comments, or requests
- regarding library format, or if you note any ambiguities or
- contradictions in these specifications, please feel free to
- contact me.
-
- Gary P. Novosielski
-
- Voice phone: (201)935-4087 Evenings and weekends
- MCI Mail: GNOVOSIELSKI
- CompuServe: [70160,120] EMAIL or CP-MIG
- Telex: 650-195-2395 6501952395 MCI
-
- End of file.
-